package com.ibeacon.controller.common;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import com.ibeacon.model.AccessToken;

import net.sf.json.JSONObject;

/**
 * 
 * 公众平台通用接口工具类
 * 
 * @author focus
 * 
 */

public class WeixinUtil {
	
	/**
	 * 
	 * 发起https请求并获取结果
	 * 
	 * 
	 * 
	 * @param requestUrl
	 *            请求地址
	 * 
	 * @param requestMethod
	 *            请求方式（GET、POST）
	 * 
	 * @param outputStr
	 *            提交的数据
	 * 
	 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
	 */

	public static JSONObject httpRequest(String requestUrl,
			String requestMethod, String outputStr) {

		JSONObject jsonObject = null;

		StringBuffer buffer = new StringBuffer();

		try {

			// 创建SSLContext对象，并使用我们指定的信任管理器初始化

			TrustManager[] tm = { new MyX509TrustManager() };

			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

			sslContext.init(null, tm, new java.security.SecureRandom());

			// 从上述SSLContext对象中得到SSLSocketFactory对象

			SSLSocketFactory ssf = sslContext.getSocketFactory();

			URL url = new URL(requestUrl);

			HttpsURLConnection httpUrlConn = (HttpsURLConnection) url
					.openConnection();

			httpUrlConn.setSSLSocketFactory(ssf);

			httpUrlConn.setDoOutput(true);

			httpUrlConn.setDoInput(true);

			httpUrlConn.setUseCaches(false);

			// 设置请求方式（GET/POST）

			httpUrlConn.setRequestMethod(requestMethod);

			if ("GET".equalsIgnoreCase(requestMethod))

				httpUrlConn.connect();

			// 当有数据需要提交时

			if (null != outputStr) {

				OutputStream outputStream = httpUrlConn.getOutputStream();

				// 注意编码格式，防止中文乱码

				outputStream.write(outputStr.getBytes("UTF-8"));

				outputStream.close();

			}

			// 将返回的输入流转换成字符串

			InputStream inputStream = httpUrlConn.getInputStream();

			InputStreamReader inputStreamReader = new InputStreamReader(
					inputStream, "utf-8");

			BufferedReader bufferedReader = new BufferedReader(
					inputStreamReader);

			String str = null;

			while ((str = bufferedReader.readLine()) != null) {

				buffer.append(str);

			}

			bufferedReader.close();

			inputStreamReader.close();

			// 释放资源

			inputStream.close();

			inputStream = null;

			httpUrlConn.disconnect();

			jsonObject = JSONObject.fromObject(buffer.toString());

		} catch (ConnectException ce) {

		} catch (Exception e) {

		}

		return jsonObject;

	}
	
	public static AccessToken getAccessToken(String appidp,String appsecretp){
		Log log = Log.getLogger();
		AccessToken accessToken = new AccessToken();
		log.logger.info("开始获取access_token");
		String grant_type = "client_credential";
		String appid = appidp;
		String secret = appsecretp;
		String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
		String json = "{}";
		JSONObject jsonObj = WeixinUtil.httpRequest(url, "POST", json);
		String access_token = jsonObj.getString("access_token");
		if(access_token ==null||"".equals(access_token)){
			log.logger.error("获取accessToken失败");    
		}else{
			 accessToken.setToken(access_token);
			 accessToken.setExpiresIn(7200);
			 log.logger.info("获取access_token成功");
		}
		log.logger.info("获取access_token结束");
		
		log.logger.info("开始获取jsapi_ticket");
		String url1 = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";
		String json1 = "{}";
		JSONObject jsonObj1 = WeixinUtil.httpRequest(url1, "POST", json1);
		String ticket = jsonObj1.getString("ticket");
		if(ticket ==null||"".equals(ticket)){
			log.logger.error("获取ticket失败");    
		}else{
			 accessToken.setTicket(ticket);
			 log.logger.info("获取ticket成功");
		}
		log.logger.info("获取jsapi_ticket结束");
		
		return accessToken;
	}

}